<?php

/**
 * \file
 * Classe d'un bloc pour afficher un Objet.
 */

namespace pilar\Scaffolding /* \cond */ ; /* \endcond */
{

/**
 * Bloc d'affichage d'un objet.
 *
 * \since 26/02/2009
 * \author Dirk MARSKI <dirk.marski@gmail.com>
 */
class Datasheet extends \pilar\Blocks\Block {
	
/**
 * Membres d'entité présents dans l'affichage.
 *
 * \since 26/02/2009
 */
protected $_members = array();

protected function loadDefaultParams() {
 parent::loadDefaultParams();

 $this->params->define(array(
  'object' => '',  // Objet que l'on souhaite afficher.
  'memberNames' => array('default' => true), // Membres de l'objet que l'on 
                                             // souhaite afficher.
  'refs' => array(), // Nom des références à exporter.
  'authorizationParams' => array() // Paramètres pour les autorisations.
 ));
}


protected function initialize() {
 $this->params->localId = '_'.$this->get('object')->entity()->get('name').
                          '_'.$this->get('object')->id();

 parent::initialize();
}


protected function load() {
 parent::load();

 // Charger les membres de l'objet :
  $this->loadMembers();

 $this->addContentPrecedingFile(
  $this->get('object')->entity()->touchFile()
 );
}


/**
 * Charge les membres à partir des noms passés en paramètres et à partir
 * de la modélisation de l'entité.
 *
 * \since 26/02/2009
 **/
private function loadMembers() {
 // Détermination des noms de membres à prendre en compte :
  $names = array(); // Variable de résultat.
  $conf = $this->get('memberNames'); // Alias de code.
  // Sélection par défaut :
   if(!isset($conf['default']) || $conf['default']) {
    foreach($this->get('object')->entity()->members as $m) {
     if($m->get('inDatasheets')) $names[] = $m->get('name');
    }
   }
  // Modifications par soustractions :
   if(isset($conf['sub'])) $names = array_diff($names, $conf['sub']);
  // Modifications par ajout :
   if(isset($conf['add'])) $names = array_merge($names, $conf['add']);
   
 // Chargement des membres de formulaire :
  $refs = $this->param('refs');

  foreach($names as $name) {
   if (isset($refs[$name])) {
    
    $member = $this->get('object')->__get($name);
    foreach ($refs[$name] as $mn) {
     // TODO G�rer le cas ou il n'y a rien en base de donn�e.
     $this->_members[] = $member->member($mn);
    }
   } else {
    $this->_members[] = $this->get('object')->member($name);
   }
  }
}


/**
 * Version DOM de l'objet, en affichant que les membres chargées.
 *
 * \param $domDoc \DOMDocument a utiliser comme document parent.
 * \return Noeud DOM de l'objet.
 *
 * \since 26/02/2009
 */
private function domNode($domDoc) {
 $domObject = $domDoc->createElement('Object');
 $domObject->setAttribute('name', $this->get('object')->entity()->get('name'));
 
 if ($this->get('object')->rating != 0) {
 	$domObject->setAttribute('rating', $this->get('object')->rating);
 }

 foreach ($this->_members as $member) {
  $domObject->appendChild($member->domNode_generic($domDoc));
 }

 $links = $this->get('object')->links();

 foreach ($links as $link) {
  $domLink = $link->domNode($domDoc);
  $domObject->appendChild($domLink);
 }

 return $domObject;
}


public function buildContentRoot($domDoc) {
 $domDatasheet = $domDoc->createElement('Datasheet');

 $domDatasheet->appendChild($this->domNode($domDoc));
 
 return $domDatasheet;
}

} // Class.

} // Namespace.

?>
